/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package managers;

import beans.Boliche;
import beans.DiaSalida;
import beans.Socio;
import beans.Visita;
import dao.BolicheDao;
import dao.DiaSalidaDao;
import dao.PersonaDao;
import dao.SocioMerger;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.table.AbstractTableModel;
import util.VisitaRow;
import util.VisitasTableModel;

/**
 *
 * @author nMoncho
 */
public class ManagerVisitas {

    private VisitasTableModel tableModel;
    private List<VisitaRow> modelo;

    public ManagerVisitas(){
        this.modelo = new ArrayList<VisitaRow>();
        this.tableModel = new VisitasTableModel(modelo);
    }

    public AbstractTableModel getModel(){
        return tableModel;
    }

    public Socio getSocioPorLegajoYBoliche(String legajo, Integer id){
        return PersonaDao.getSocioPorLegajoEIDBoliche(legajo, id);
    }

    public boolean cargarVisita(Socio socio, String nombreDia){
        boolean exito = false;
        if(socio == null){
            JOptionPane.showMessageDialog(null, "No tenes ningun socio buscado, ingresa su legajo\ny luego presiona \"Buscar\"", "No hay Socio Buscado", JOptionPane.WARNING_MESSAGE+JOptionPane.YES_OPTION);
        }else{
            if(!socioYaCargado(socio)){
                int cantidadInvitados = 0;
                try{
                    cantidadInvitados = Integer.parseInt(JOptionPane.showInputDialog("Ingresa la cantidad de invitados que trajo\n(Ingresa 0 si vino solo)",new Integer(0)));
                    DiaSalida dia = DiaSalidaDao.getDiaSalida(nombreDia);
                    VisitaRow row = new VisitaRow(socio, cantidadInvitados, dia);
                    modelo.add(row);

                    exito = true;
                }catch(NumberFormatException ex){
                    JOptionPane.showMessageDialog(null, "Ingresaste mal la cantidad de invitados\nRevisar por favor", "Error", JOptionPane.ERROR_MESSAGE+JOptionPane.OK_OPTION);
                }
            }else{
                JOptionPane.showMessageDialog(null, "El socio que queres ingresar ya esta cargado", "Socio ya ingresado", JOptionPane.INFORMATION_MESSAGE+JOptionPane.YES_OPTION);
                exito = true;//Como ya esta ingresado, regreso true y lo borro de la busqueda
            }
            
        }

        return exito;
    }

    private boolean socioYaCargado(Socio socio){
        for(VisitaRow row : modelo){
            if(socio.getId().intValue() == row.getSocio().getId().intValue())
                return true;
        }

        return false;
    }

    public void guardarVisitas(String nombreDia, Boliche boliche){
        DiaSalida dia = DiaSalidaDao.getDiaSalida(nombreDia);
        Visita visita = null;
        Socio socio;
        List<Socio> socios = new LinkedList<Socio>();
        Visita[] visitas = new Visita[modelo.size()]; int i=0;
        Integer puntajeTotal = null;
        //Recorrer filas
        for(VisitaRow row : modelo){

            //Crear visita
            visita = new Visita();
            visita.setBoliche(boliche);
            visita.setCantidadAmigos(row.getCantidadInvitados());
            visita.setPuntajeParcial(row.getPuntajeParcial());
            visita.setDia(dia.getNombre());
            puntajeTotal = row.getPuntajeTotal();

            socio = row.getSocio();
            socio.setPuntajeTotal(puntajeTotal);
            //socio.getVisitas().add(visita);
            visitas[i] = visita;
            i++;
            socios.add(socio);
        }
        
        int respuesta = JOptionPane.showConfirmDialog(null, "Los cambios se haran permanentes.\n¿Esta seguro que desea guardar?","Guargar", JOptionPane.INFORMATION_MESSAGE+JOptionPane.YES_NO_OPTION);
        
        if(respuesta == JOptionPane.YES_OPTION){
            SocioMerger.merge(socios);
            boolean exitoGuardar = PersonaDao.saveVisitas(socios, visitas);
            
            if(exitoGuardar){
                JOptionPane.showMessageDialog(null, "Los datos de las visitas han sido guardados exitosamente.", "Exito al Grabar", JOptionPane.INFORMATION_MESSAGE+JOptionPane.OK_OPTION);
                modelo.clear();//Limpio el modelo para que la grilla aparezca vacia
            }else{
                JOptionPane.showMessageDialog(null, "Ha ocurrio un error tratando de grabar los datos.\nPor favor vuelva a intentarlo", "Error al Grabar", JOptionPane.ERROR_MESSAGE+JOptionPane.OK_OPTION);
            }
        }
    }

    public void actualizarPuntajesParaTodaTabla(String nombreDia){
        System.out.println("Actulizando puntajes!!!");
        DiaSalida dia = DiaSalidaDao.getDiaSalida(nombreDia);
        for(VisitaRow row : modelo){
            row.setDia(dia);
        }

        //Falta que el JTable actualice su render, esto lo haria la ventana
    }

    public Boliche[] getBoliches(){
        List<Boliche> boliches = BolicheDao.getBoliches();
        Boliche[] retorno = new Boliche[boliches.size()];
        int i=0;
        for(Boliche boliche : boliches){
            retorno[i] = boliche;
            
            i++;
        }

        return retorno;
    }

    public void borrarVisita(int row) {
        modelo.remove(row);
    }
}
